#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=2e5+5;

struct point{
	double x[2];
}p[N];

struct node{
	int ls,rs,sz;
	point tp;
}tr[N];

int n,rt,D,top,cur,rub[N],op;
double ans=5e9;

int newnode(){
	if(top)return rub[top--];
	else return ++cur;
}

bool cmp(const point& a,const point& b){
	return a.x[D]<b.x[D];
}

void up(int k){
	int l=tr[k].ls,r=tr[k].rs;
	if(l)ans=min(ans,sqrt((tr[k].tp.x[0]-tr[tr[k].ls].tp.x[0])*(tr[k].tp.x[0]-tr[tr[k].ls].tp.x[0])+(tr[k].tp.x[1]-tr[tr[k].ls].tp.x[1])*(tr[k].tp.x[1]-tr[tr[k].ls].tp.x[1])));
	if(r)ans=min(ans,sqrt((tr[k].tp.x[0]-tr[tr[k].rs].tp.x[0])*(tr[k].tp.x[0]-tr[tr[k].rs].tp.x[0])+(tr[k].tp.x[1]-tr[tr[k].rs].tp.x[1])*(tr[k].tp.x[1]-tr[tr[k].rs].tp.x[1])));
	tr[k].sz=tr[tr[k].ls].sz+tr[tr[k].rs].sz+1;
}

int build(int l,int r,int d){
	if(l>r) return 0;
	int mid=(l+r)>>1,k=newnode();
	D=d,nth_element(p+l,p+mid,p+r+1,cmp),tr[k].tp=p[mid];
	tr[k].ls=build(l,mid-1,d^1),tr[k].rs=build(mid+1,r,d^1);
	up(k);
	return k;
}

void pia(int k,int num){
	if(tr[k].ls) pia(tr[k].ls,num);
	p[tr[tr[k].ls].sz+num+1]=tr[k].tp,rub[++top]=k;
	if(tr[k].rs) pia(tr[k].rs,num+tr[tr[k].ls].sz+1);
}

void check(int& k,int d){
	if(tr[k].sz*0.75<tr[tr[k].ls].sz||tr[k].sz*0.75<tr[tr[k].rs].sz){
		pia(k,0);
		k=build(1,tr[k].sz,d);
	}
}

void ins(int& k,point tmp,int d){
	if(!k){
		k=newnode();
		tr[k].ls=tr[k].rs=0;
		tr[k].tp=tmp;
		up(k);
		return;
	}
	if(tmp.x[d]<=tr[k].tp.x[d]) ins(tr[k].ls,tmp,d^1);
	else ins(tr[k].rs,tmp,d^1);
	up(k);
	check(k,d);
}

// int query(int k,int x1,int y1,int x2,int y2){

// }

void solve(){
	cin>>n;
	for(int i=0;i<n;i++){
		int x,y;
		cin>>x>>y;
		ins(rt,{x,y},0);
	}
	cout<<fixed<<setprecision(4)<<ans;
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    int t=1;
    // cin>>t;
    while(t--){
        solve();
    }
    return 0;
}
